package com.zenithmind.chat.pojo.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

/**
 * 群组成员设置DTO - 遵循单一职责原则
 * 只负责群组成员设置的数据传输
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@Schema(description = "群组成员设置DTO")
public class ChatGroupMemberSettingDTO {

    @Schema(description = "群组ID")
    @NotBlank(message = "群组ID不能为空")
    private String groupId;

    @Schema(description = "用户ID")
    @NotBlank(message = "用户ID不能为空")
    private String userId;

    @Schema(description = "群内昵称")
    @Size(max = 50, message = "群内昵称长度不能超过50个字符")
    private String nickname;

    @Schema(description = "是否置顶")
    private Boolean isTop;

    @Schema(description = "是否免打扰")
    private Boolean isMuted;

    @Schema(description = "消息提醒设置")
    private Integer messageNotification;

    @Schema(description = "是否显示成员昵称")
    private Boolean showMemberNickname;

    @Schema(description = "是否保存到通讯录")
    private Boolean saveToContacts;

    /**
     * 验证DTO数据
     * 
     * @return 验证结果
     */
    public boolean isValid() {
        return groupId != null && !groupId.trim().isEmpty() &&
               userId != null && !userId.trim().isEmpty();
    }

    /**
     * 检查是否有昵称更新
     * 
     * @return 是否有昵称更新
     */
    public boolean hasNicknameUpdate() {
        return nickname != null;
    }

    /**
     * 检查是否有置顶状态更新
     * 
     * @return 是否有置顶状态更新
     */
    public boolean hasTopStatusUpdate() {
        return isTop != null;
    }

    /**
     * 检查是否有免打扰状态更新
     * 
     * @return 是否有免打扰状态更新
     */
    public boolean hasMuteStatusUpdate() {
        return isMuted != null;
    }

    /**
     * 检查是否有消息提醒设置更新
     * 
     * @return 是否有消息提醒设置更新
     */
    public boolean hasMessageNotificationUpdate() {
        return messageNotification != null;
    }

    /**
     * 检查是否有显示昵称设置更新
     * 
     * @return 是否有显示昵称设置更新
     */
    public boolean hasShowMemberNicknameUpdate() {
        return showMemberNickname != null;
    }

    /**
     * 检查是否有保存到通讯录设置更新
     * 
     * @return 是否有保存到通讯录设置更新
     */
    public boolean hasSaveToContactsUpdate() {
        return saveToContacts != null;
    }

    /**
     * 检查是否置顶
     * 
     * @return 是否置顶
     */
    public boolean isTop() {
        return isTop != null && isTop;
    }

    /**
     * 检查是否免打扰
     * 
     * @return 是否免打扰
     */
    public boolean isMuted() {
        return isMuted != null && isMuted;
    }

    /**
     * 检查是否显示成员昵称
     * 
     * @return 是否显示成员昵称
     */
    public boolean showMemberNickname() {
        return showMemberNickname != null && showMemberNickname;
    }

    /**
     * 检查是否保存到通讯录
     * 
     * @return 是否保存到通讯录
     */
    public boolean saveToContacts() {
        return saveToContacts != null && saveToContacts;
    }

    /**
     * 获取消息提醒设置名称
     * 
     * @return 消息提醒设置名称
     */
    public String getMessageNotificationName() {
        if (messageNotification == null) {
            return "默认";
        }
        switch (messageNotification) {
            case 0:
                return "不接收消息";
            case 1:
                return "接收所有消息";
            case 2:
                return "仅接收@我的消息";
            case 3:
                return "仅接收重要消息";
            default:
                return "未知";
        }
    }

    /**
     * 获取安全的昵称
     * 
     * @return 安全的昵称
     */
    public String getSafeNickname() {
        return nickname != null ? nickname.trim() : "";
    }

    /**
     * 检查是否有任何设置更新
     * 
     * @return 是否有设置更新
     */
    public boolean hasAnyUpdate() {
        return hasNicknameUpdate() || hasTopStatusUpdate() || hasMuteStatusUpdate() ||
               hasMessageNotificationUpdate() || hasShowMemberNicknameUpdate() || hasSaveToContactsUpdate();
    }

    /**
     * 获取更新字段数量
     * 
     * @return 更新字段数量
     */
    public int getUpdateFieldCount() {
        int count = 0;
        if (hasNicknameUpdate()) count++;
        if (hasTopStatusUpdate()) count++;
        if (hasMuteStatusUpdate()) count++;
        if (hasMessageNotificationUpdate()) count++;
        if (hasShowMemberNicknameUpdate()) count++;
        if (hasSaveToContactsUpdate()) count++;
        return count;
    }

    /**
     * 获取设置摘要
     * 
     * @return 设置摘要
     */
    public String getSettingSummary() {
        StringBuilder summary = new StringBuilder();
        
        if (isTop()) {
            summary.append("置顶 ");
        }
        if (isMuted()) {
            summary.append("免打扰 ");
        }
        if (showMemberNickname()) {
            summary.append("显示昵称 ");
        }
        if (saveToContacts()) {
            summary.append("保存到通讯录 ");
        }
        
        summary.append(getMessageNotificationName());
        
        return summary.toString().trim();
    }
}
